C#和NewSQL更配 —— CockroachDB入门(可能是C#下的全网首发)

如果这是第二次看到我的文章,欢迎订阅z哥的公众号(跨界架构师)哦~

每周五11:45 按时送达。当然了,也会时不时加个餐~


一、CockroachDB是什么

       CockroachDB(https://www.cockroachlabs.com)是Google备受瞩目的Spanner的开源模仿,承诺提供一种高存活性、强一致性,可横向扩展的SQL数据库。主要的设计目标是全球一致性和可靠性,从蟑螂(cockroach)的命名上是就能看出这点 [ 打不死的小强:) ]。Cockroach节点是均衡的,其设计目标是同质部署(只有一个二进制包)且最小配置。CockroachDB的扩展非常容易,只要一行命令,秒级进行。

二、环境部署

        官方文档写的非常详细,按照做就好了。部署的文档(https://www.cockroachlabs.com/docs/stable/install-cockroachdb.html),笔者在CentOS上直接使用Binary的方式进行的部署。

        安装完之后开始启动CockroachDB了,启动命令参考文档(https://www.cockroachlabs.com/docs/stable/start-a-node.html)。

        cockroach start --insecure \--store=hello-1 \--host=192.168.118.21

        解释下这行命令:启动一个CockroachDB的节点,存储位置为安装所在目录下的hello-1,并且使用192.168.118.21进行host,如果需要还可以指定管理站点的端口和数据库对外端口,对应的参数为 --port = 26257(默认值)、--http-port = 8080(默认值)

        OK,启动完之后可以在浏览器输入host中指定的IP:端口进入到管理站点,界面如下图1:

                                                                   【图1】

三、实战

       在真正的使用C#代码调用之前首先先创建一个账户,使用cockroach user 命令。需要注意的是,如果之前在启动节点时指定了ip和端口,那么同样需要进行指定。同样的,再创建一个数据库并且给创建的账户设置权限。代码如下:

cockroach user set testaccount --insecure --host=192.168.118.21

cockroach sql --insecure -e 'CREATE DATABASE test' --host=192.168.118.21

cockroach sql --insecure -e 'GRANT ALL ON DATABASE test TO testaccount'  --host=192.168.118.21

       其实在安装完CockroachDB之后会自带SQL Client,在这个上面可以运行所有的SQL语句。当然我们这里暂时不讨论这个,有兴趣的小伙伴可以转到(https://www.cockroachlabs.com/docs/stable/use-the-built-in-sql-client.html)。

       由于CockroachDB支持PostgreSQL的协议,所以我们可以使用C#下比较热门的PostgreSQL驱动,下载地址:https://github.com/npgsql/npgsql 。我们需要使用的其实就是其中的npgsql项目编译出来的dll。好了,开始创建一个表并初始化2条数据:

using(varconn =newNpgsqlConnection("Server=192.168.118.21;PORT=26257;User ID=testaccount;Password=testaccount;Database=test;Timeout=0;Command Timeout=0"))

{

      conn.Open();

      conn.ExecuteNonQuery("CREATE TABLE IF NOT EXISTS accounts (id INT PRIMARY KEY, balance INT)");

       using(varcmd =newNpgsqlCommand("INSERT INTO accounts (id, balance) VALUES (1, 1000), (2, 250)",conn))

      {

             cmd.ExecuteNonQuery();

      }

}

        可以看到建表的语句所支持的语法和SQL SERVER还是有一些差别的,可以直接在CREATE TABLE 后面跟判断表是否存在。好了,执行完可以点击管理站点左上角的“DATABASES”选项卡,就可以看到下面的数据库(test)和表(accounts)了,图2:

                                                                       【图2】

       好,我们来尝试着读取的一下数据:

using(varconn =newNpgsqlConnection("Server=192.168.118.21;PORT=26257;User ID=testaccount;Password=testaccount;Database=test;Timeout=0;Command Timeout=0"))

{    

        conn.Open();

        using(varcmd =newNpgsqlCommand("SELECT id, balance FROM accounts", conn))  

        {

                using(varreader =cmd.ExecuteReader(Behavior))     

                {

                        while(reader.Read())

                       {

                               Console.WriteLine(@" reader[id] is {0}", reader["id"]);

                               Console.WriteLine(@" reader[balance] is {0}", reader["balance"]);

                       }

                 }

       }

}

       这里需要注意一点的是。npgsql如果使用连接字符串的方式来初始化连接,那么其默认的连接模式为连接池模式。在此模式下,一但创建的NpgsqlConnection被Dispose()一次之后,后续哪怕再继续实例化一个新的NpgsqlConnection也会报错。如果要使用这种短链接的方式,需要使用NpgsqlConnectionStringBuilder来进行连接的实例化,并且指定 Pooling = true,如下。

var connString = newNpgsqlConnectionStringBuilder("Server=192.168.118.21;PORT=26257;User ID=testaccount;Password=testaccount;Database=test;Timeout=0;Command Timeout=0")

{

       Pooling=true

}.ToString();

using(varconn =newNpgsqlConnection(connString))

四、性能测试

测试客户端机器是 4核 i5-4300U,数据库所在的机器是 8核 Xeon(R) E5630。为了做一个相应的对比,我在CockroachDB所在的机器装了SQL Server 2017 on Lunix、另外也用了装在同等配置下的windows服务器上的SQL SERVER2008进行对比。见图3(点击图片可查看大图):

                                                                   【图3】

        大家可以着重看数据库响应时间那列,这里的时间是纯的数据库响应+2次网络I/O的时间,减少数据库访问SDK对结果的影响。但是很明显从”线程时间列“中看出nqgsql中对连接的开销比.net framework中的sqlconnection还是大了2个数量级,所以我们在运用的时候需要考虑封装一层连接池来实现。

       测试结果得出的结论是:CockroachDB在长连接模式下的性能是SQL SERVER的3倍以上,其它场景完全没法用,所以如果要运用CockroachDB还是要围绕这个模式去做。另外SQL SERVER在自家Windows和Lunix上还是有些小差异的,都使用默认设置,性能上高出几个百分点,当然SQL SERVER的版本不同可能也会带来一些影响,这里没有继续深入测试,结果仅供参考。

五、结语

       再做上面的一系列工作中,也对CockroachDB的一些信息做了更深入的了解。其目前主要还是围绕着开头说的”可伸缩、跨地域(全球)复制且兼容事务的 ACID 特性的分布式数据库“来做,并不适用于复杂Join或者OLAP型需求的场景。不过其还很年轻,目前只有3岁,从github上的热度来看,其未来的发展还是前途一篇光明的,并且谷歌在Go语言上的投入对CockroachDB的受益是直接的,所以保持持续的关注。

       另外如果各位的确有跨机房多数据中心的需求,并且几个机房的位置离的不远,能够对NTP(如果对CockroachDB的基于NTP的实现HLC感兴趣,可以转到这篇文章:http://www.jianshu.com/p/8500882ab38c)的时钟误差控制在一定可以接受的范围内,我认为还是值得一试的。毕竟动态扩容和rebalance真的是你手指动动秒秒钟的事情,运维成本非常低。


▶作者:Zachary(个人微信号:Zachary-ZF)

微信公众号(首发):跨界架构师<-- 点击查阅近期热门文章

如果你是初级程序员,想提升但不知道如何下手。又或者做程序员多年,陷入了一些瓶颈想拓宽一下视野。欢迎关注我的公众号「跨界架构师」,回复「技术」,送你一份我长期收集和整理的思维导图。

如果你是运营,面对不断变化的市场束手无策。又或者想了解主流的运营策略,以丰富自己的“仓库”。欢迎关注我的公众号「跨界架构师」,回复「运营」,送你一份我长期收集和整理的思维导图。

定期发表原创内容:架构设计丨分布式系统丨产品丨运营丨一些深度思考

扫码加入小圈子👇

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • sqlmap用户手册 说明:本文为转载,对原文中一些明显的拼写错误进行修正,并标注对自己有用的信息。 ======...
    wind_飘阅读 1,945评论 0 5
  • http://192.168.136.131/sqlmap/mysql/get_int.php?id=1 当给sq...
    xuningbo阅读 10,147评论 2 22
  • 环境 操作系统:CentOS-6.6-x86_64-bin-DVD1.iso MySQL版本:mysql-5.6....
    思梦PHP阅读 2,009评论 0 12
  • 那天声如出谷黄莺,清脆似雨打铜铃,绊住了街上所有车水马龙,却唯独没有留住你。 我从来没想到会这么想念一个萍水相蓬只...
    羊角429阅读 494评论 1 2